
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import { each, createHashMap, assert, map } from 'zrender/lib/core/util.js';
import { VISUAL_DIMENSIONS } from '../../util/types.js';

var DimensionUserOuput =
/** @class */
function () {
	function DimensionUserOuput(encode, dimRequest) {
		this._encode = encode;
		this._schema = dimRequest;
	}

	DimensionUserOuput.prototype.get = function () {
		return {
			// Do not generate full dimension name until fist used.
			fullDimensions: this._getFullDimensionNames(),
			encode: this._encode
		};
	};
	/**
   * Get all data store dimension names.
   * Theoretically a series data store is defined both by series and used dataset (if any).
   * If some dimensions are omitted for performance reason in `this.dimensions`,
   * the dimension name may not be auto-generated if user does not specify a dimension name.
   * In this case, the dimension name is `null`/`undefined`.
   */

	DimensionUserOuput.prototype._getFullDimensionNames = function () {
		if (!this._cachedDimNames) {
			this._cachedDimNames = this._schema ? this._schema.makeOutputDimensionNames() : [];
		}

		return this._cachedDimNames;
	};

	return DimensionUserOuput;
}();

export function summarizeDimensions(data, schema) {
	var summary = {};
	var encode = summary.encode = {};
	var notExtraCoordDimMap = createHashMap();
	var defaultedLabel = [];
	var defaultedTooltip = [];
	var userOutputEncode = {};
	each(data.dimensions, function (dimName) {
		var dimItem = data.getDimensionInfo(dimName);
		var coordDim = dimItem.coordDim;

		if (coordDim) {
			if (process.env.NODE_ENV !== 'production') {
				assert(VISUAL_DIMENSIONS.get(coordDim) == null);
			}

			var coordDimIndex = dimItem.coordDimIndex;
			getOrCreateEncodeArr(encode, coordDim)[coordDimIndex] = dimName;

			if (!dimItem.isExtraCoord) {
				notExtraCoordDimMap.set(coordDim, 1); // Use the last coord dim (and label friendly) as default label,
				// because when dataset is used, it is hard to guess which dimension
				// can be value dimension. If both show x, y on label is not look good,
				// and conventionally y axis is focused more.

				if (mayLabelDimType(dimItem.type)) {
					defaultedLabel[0] = dimName;
				} // User output encode do not contain generated coords.
				// And it only has index. User can use index to retrieve value from the raw item array.

				getOrCreateEncodeArr(userOutputEncode, coordDim)[coordDimIndex] = data.getDimensionIndex(dimItem.name);
			}

			if (dimItem.defaultTooltip) {
				defaultedTooltip.push(dimName);
			}
		}

		VISUAL_DIMENSIONS.each(function (v, otherDim) {
			var encodeArr = getOrCreateEncodeArr(encode, otherDim);
			var dimIndex = dimItem.otherDims[otherDim];

			if (dimIndex != null && dimIndex !== false) {
				encodeArr[dimIndex] = dimItem.name;
			}
		});
	});
	var dataDimsOnCoord = [];
	var encodeFirstDimNotExtra = {};
	notExtraCoordDimMap.each(function (v, coordDim) {
		var dimArr = encode[coordDim];
		encodeFirstDimNotExtra[coordDim] = dimArr[0]; // Not necessary to remove duplicate, because a data
		// dim canot on more than one coordDim.

		dataDimsOnCoord = dataDimsOnCoord.concat(dimArr);
	});
	summary.dataDimsOnCoord = dataDimsOnCoord;
	summary.dataDimIndicesOnCoord = map(dataDimsOnCoord, function (dimName) {
		return data.getDimensionInfo(dimName).storeDimIndex;
	});
	summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra;
	var encodeLabel = encode.label; // FIXME `encode.label` is not recommended, because formatter cannot be set
	// in this way. Use label.formatter instead. Maybe remove this approach someday.

	if (encodeLabel && encodeLabel.length) {
		defaultedLabel = encodeLabel.slice();
	}

	var encodeTooltip = encode.tooltip;

	if (encodeTooltip && encodeTooltip.length) {
		defaultedTooltip = encodeTooltip.slice();
	} else if (!defaultedTooltip.length) {
		defaultedTooltip = defaultedLabel.slice();
	}

	encode.defaultedLabel = defaultedLabel;
	encode.defaultedTooltip = defaultedTooltip;
	summary.userOutput = new DimensionUserOuput(userOutputEncode, schema);
	return summary;
}

function getOrCreateEncodeArr(encode, dim) {
	if (!encode.hasOwnProperty(dim)) {
		encode[dim] = [];
	}

	return encode[dim];
} // FIXME:TS should be type `AxisType`

export function getDimensionTypeByAxis(axisType) {
	return axisType === 'category' ? 'ordinal' : axisType === 'time' ? 'time' : 'float';
}

function mayLabelDimType(dimType) {
	// In most cases, ordinal and time do not suitable for label.
	// Ordinal info can be displayed on axis. Time is too long.
	return !(dimType === 'ordinal' || dimType === 'time');
} // function findTheLastDimMayLabel(data) {
//     // Get last value dim
//     let dimensions = data.dimensions.slice();
//     let valueType;
//     let valueDim;
//     while (dimensions.length && (
//         valueDim = dimensions.pop(),
//         valueType = data.getDimensionInfo(valueDim).type,
//         valueType === 'ordinal' || valueType === 'time'
//     )) {} // jshint ignore:line
//     return valueDim;
// }